export class BlackBoard<T extends Object> {
    /**
     * 存入一个对象，并可以实现按对像的属性不同，ts 提示不同类型的数据管理类，
     * 可以输入一个 interface 来约束对象
     * 增删改查将会得到检查辅助
     */
    constructor(private store: T) {
        this.keys = new Set(Object.keys(store)) as Set<keyof T>;
    }
    private keys: Set<keyof T>;
    /**不允许获取未初始化的值 */
    get<S extends keyof T>(key: S) {
        if (this.keys.has(key)) {
            return this.store[key]! as T[S];
        } else {
            throw new Error(key + " 位置上没有任何值");
        }
    }
    /** 不允许覆盖对象，想要修改时，应该先删除然后写入 */
    set<S extends keyof T>(key: S, value: T[S]) {
        if (this.keys.has(key)) {
            throw new Error(key + " 属性不允许复写");
        } else {
            this.store[key] = value;
            this.keys.add(key);
        }
    }
    delete(key: keyof T) {
        const isDelete = this.keys.delete(key);
        if (isDelete) {
            delete this.store[key];
        } else {
            throw new Error(key + " 位置上的值已经被销毁");
        }
    }
}
